23

» WarCraft 3 / Не могу нормально создать способность...

Похожие вопросы:

ответ
это Q/A
тут разрешены только вопросы
в следующий раз за заявки типа "сделайте мне что либо" пойдут варны
ответ
FabulousTiger, большенству людей сложно влиться в чужой проект если тот абсолютно не отвечает некоторым критериям либо человеку может просто не нравится задумка. И это далеко не та ситуация когда нужно проглотить свое негодование, уровень роботы такого человека будет напрямую зависеть от того насколько ему нравится проект.
KaneThaumaturge, твоя скорость изучения JASS будет напрямую зависеть от того насколько ты в это захочешь втянуться. Правда должен предупредить что есть люди которые просто не приспособлены к тому что-бы понять програмирование в его ярчайшем проявлении, такие люди обычно при разработке проекта опираются на то что умею лучше всего.
Я из опыта скажу что: есть некоторые вещи которые возможно создать только при помощи JASS, но реализацию большенства идей можно выполнить при помощи GUI. Покопайся в чужих наработка пойми что ты хочешь и что можешь использовать из предоставленного тебе и вперед делать проект.

23

» WarCraft 3 / Ошибка.

Похожие вопросы:

ответ
Проблема в Coordinate functions
ответ
Так ты всю либо кинь.
кат
//=====================================================================================================\\
library MainBar initializer InitSetBar

    native UnitAlive takes unit u returns boolean

    globals
        constant real br_updatePeriod = 0.2 //период обновления баров.
        integer array br_indHP //сохраняет текущий индекс модели хпбара,  чтобы сравнить, изменился ли он.
        integer array br_indMP //сохраняет текущий индекс модели мпбара,  чтобы сравнить, изменился ли он.
        integer array br_abilityHP
        integer array br_abilityMP
        integer br_unitCounter = 0
        effect array br_effHP //записывает хпбар, чтобы его можно было удалить и заменить другим.
        effect array br_effMP //записывает хпбар, чтобы его можно было удалить и заменить другим.
        region br_mapArea = null
        unit array br_unit
        boolean array br_unitIntimer
    endglobals
    
    nothing SetBar( ){ 
        integer i = 1
        integer iend = br_unitCounter
        integer indHP
        integer indMP
        loop{
            exitwhen i > iend
            if (UnitAlive(br_unit[i])) {
                indHP = R2I(GetUnitLifePercent(br_unit[i])/5)
                if (br_indHP[i] != indHP)  {
                    UnitRemoveAbility(br_unit[i], br_abilityHP[br_indHP[i]])
                    UnitAddAbility   (br_unit[i],  br_abilityHP[indHP])
                    br_indHP[i] = indHP
                }
                indMP = R2I(GetUnitManaPercent(br_unit[i])/5)
                if (br_indMP[i] != indMP) and (GetUnitState(br_unit[i], UNIT_STATE_MAX_MANA) > 0) {
                    UnitRemoveAbility(br_unit[i], br_abilityMP[br_indMP[i]])
                    UnitAddAbility   (br_unit[i],  br_abilityMP[indMP])
                    br_indMP[i] = indMP
                }
            }
            i++
        }
    }

    nothing TimerStartEx ( timer whichTimer, real period, boolean isPeriodic, code handlerFunc, integer userData ){ 
        TimerStart(whichTimer, I2R(userData), false, null)
        PauseTimer(whichTimer)
        TimerStart(whichTimer, period, isPeriodic, handlerFunc )
    }
 
    integer TimerGetUserData ( timer whichTimer ){ 
        return R2I(TimerGetRemaining(whichTimer )+0.5)
    }

    nothing ClearIDBar () {
        timer t = GetExpiredTimer()
        integer id = TimerGetUserData(t)
        if UnitAlive(br_unit[id]) == false {
            br_unit[id] = br_unit[br_unitCounter]
            br_effHP[id] = br_effHP[br_unitCounter]
            br_effMP[id] = br_effMP[br_unitCounter]
            br_indHP[id] = br_indHP[br_unitCounter]
            br_indMP[id] = br_indMP[br_unitCounter]
            br_unit[br_unitCounter] = null
            br_effHP[br_unitCounter] = null
            br_effMP[br_unitCounter] = null
            br_indHP[br_unitCounter] = 0
            br_indMP[br_unitCounter] = 0
            br_unitCounter = br_unitCounter - 1
        } else
        br_unitInTimer[id] = false
        DestroyTimer(t)
        t = null
    }
    
    nothing ClearRemoteUnits() {
        integer i = 1
        integer iend = br_unitCounter
        loop{
            exitwhen i > iend
            if (br_unit[i] == null) and (br_unitInTimer[i] == false) {
            BJDebugMsg("null " + I2S(i))
            }
            i++
        }
    }

    nothing ClearBarDeath ( ){ 
        integer i = 1
        integer iend = br_unitCounter
        integer id
        loop {
            exitwhen i > iend
            if br_unit[i] == GetTriggerUnit() {
                DestroyEffect(br_effHP[i])
                DestroyEffect(br_effMP[i])
                id = i
            }
            i++
        }
        timer t = CreateTimer()
        br_unitInTimer[id] = true
        TimerStartEx(t, 88, false, function ClearIDBar, id)
        t = null
    }
    
    nothing InitSetBar(){ 
        EnablePreSelect(false, false) //скрывает полоски здоровья и информацию при наведении на юнита.
        br_abilityHP[0] = 'HP00'
        br_abilityHP[1] = 'HP01'
        br_abilityHP[2] = 'HP02'
        br_abilityHP[3] = 'HP03'
        br_abilityHP[4] = 'HP04'
        br_abilityHP[5] = 'HP05'
        br_abilityHP[6] = 'HP06'
        br_abilityHP[7] = 'HP07'
        br_abilityHP[8] = 'HP08'
        br_abilityHP[9] = 'HP09'
        br_abilityHP[10] = 'HP10'
        br_abilityHP[11] = 'HP10'
        br_abilityHP[12] = 'HP12'
        br_abilityHP[13] = 'HP13'
        br_abilityHP[14] = 'HP14'
        br_abilityHP[15] = 'HP15'
        br_abilityHP[16] = 'HP16'
        br_abilityHP[17] = 'HP17'
        br_abilityHP[18] = 'HP18'
        br_abilityHP[19] = 'HP19'
        br_abilityHP[20] = 'HP20'
        br_abilityMP[0] = 'MP00'
        br_abilityMP[1] = 'MP01'
        br_abilityMP[2] = 'MP02'
        br_abilityMP[3] = 'MP03'
        br_abilityMP[4] = 'MP04'
        br_abilityMP[5] = 'MP05'
        br_abilityMP[6] = 'MP06'
        br_abilityMP[7] = 'MP07'
        br_abilityMP[8] = 'MP08'
        br_abilityMP[9] = 'MP09'
        br_abilityMP[10] = 'MP10'
        br_abilityMP[11] = 'MP11'
        br_abilityMP[12] = 'MP12'
        br_abilityMP[13] = 'MP13'
        br_abilityMP[14] = 'MP14'
        br_abilityMP[15] = 'MP15'
        br_abilityMP[16] = 'MP16'
        br_abilityMP[17] = 'MP17'
        br_abilityMP[18] = 'MP18'
        br_abilityMP[19] = 'MP19'
        br_abilityMP[20] = 'MP20'
        integer i = 0
        integer iend = 20
        unit u = CreateUnit( Player(0), 'hfoo' , 0, 0, 0)
        loop {
            exitwhen i > iend
            UnitAddAbility(u, br_abilityHP[i])
            UnitAddAbility(u, br_abilityMP[i])
            i++
        }
        KillUnit(u)
        RemoveUnit(u)
        u = null
        TimerStart(CreateTimer(), br_updatePeriod, true, function SetBar )
        TimerStart(CreateTimer(), 30, true, function ClearRemoteUnits)
        trigger trg_br_ClearIDBarDeath = CreateTrigger( )
        TriggerRegisterAnyUnitEventBJ( trg_br_ClearIDBarDeath, EVENT_PLAYER_UNIT_DEATH )
        TriggerAddAction( trg_br_ClearIDBarDeath, function ClearBarDeath )
    } 
 
endlibrary
 //=====================================================================================================\\
Ошибка была в том, что при удалении блока else, удалил только скобки, а else оставил.
ответ
Нужен 139 мдлвис
ответ
это разные функции, локалку сделали в одной, а в другой ее записываете. это как если бы вы поставили дома у себя холодильник, потом пришли к соседу и ищете свой холодильник что бы положить туда яйца
используйте глобалки

23

» WarCraft 3 / Фильтры

Похожие вопросы:

ответ
~8gabriel8:
Если в blp сохранял через BLP Laboratory, то там надо при сохранении поставить «оставлять альфа-канал без изменений».
ответ
PT153:
Попробуй вообще убрать SetDayNightModels в main.
так не пойдет
8gabriel8:
Потому что несуществующая модель и невидимая вроде по-разному обрабатываются.
одинаково

короче, нашел решение проблемы
проблема в том, что в варкрафте кое какие криворукие программисты забабахали офигенную логику освещения , из-за которых фильтры оверлея берут за основу освещение в точке x=0. y=0. z=0. карты, если там нет освещения значит фильтр думает что и он тоже должен без освещения, решение данной проблемы является расположение модели с источником освещения по координатам в точном центре карты (включая z) и виженом для игрока в данной точке
оригинал темы с решением проблемы, а так же тест карта с моделью освещения по ссылке
ответ
Невозможно, можно наложить 50% прозрачности на серый цвет - но это не сделает их бесцветными, нужно редактировать модели.

23

» WarCraft 3 / Возможные способности для героя

Похожие вопросы:

ответ
Есть специальный ресурс , в котором ты можешь заказать способность , которую не можешь сделать сам.
ответ
Ну собственно это такая способность 'Aspb' - книга заклинаний, способность одноименного предмета...
Собственно способность 'Aspb' -spellbook имеет поле 'Ability List' как у юнитов, в котором можно указывать другие способности.
Что нам нужно:
  1. Скопировать способность 'Aspb' - книга заклианий и изменить название на желаемое, удалить иконку и обнулить все параметры ( мин и макс заклинаний ставим на 1, список способностей - тут очищаем весь список и добавлем туда интересующую вас способность, в вашем случае баш...)
  2. Нужно запретить эту способность для изучения игроком триггерно, с помощью SetPlayerAbilityAvalible (в гуях не помню как, там в разделе игрок есть эта функция)
  3. Собствнно добавлем\удаляем нашу способность на основе "спеллбука" когда захотим, она не будет отображаться и занимать место на карте команд.
Примечание:
Запрещенные способности загружаются в память в полном обьеме, не смотря на то что их не видит игрок, поэтому удаляйте все описания, эффекты, иконки, параметры которые отвечают за визуализацию, так вы увеличите скорость загрузки вашей карты, хоть и не намного.
ответ
Steal nerves:
Если на триггерах только, я знаю только на jass:
xgm.guru/p/wc3/179127 простое движение
внизу ссылки на темы, где обсуждают ошибки. Там решение даны, подправить надо самим
xgm.guru/forum/showthread.php?t=53841 отталкивание посложнее
xgm.guru/forum/showthread.php?t=45368 отталкивание
ответ
Все должно действовать, постоянно именно так и делаю. Триггер в студию.
P. S. Только одна оговорка: на всякий случай будет лучше, если способность, даваемая даммику, заранее будет присутствовать у какого-нибудь юнита на карте (можно нейтрального и/или не способного её скастануть), иначе иногда не исключены ситуации, когда даммик просто не кастует добавленную ему способность вообще (зависимость определить не удалось, абсолютно в одной и той же уже сохраненной и оптимизированной карте может кастовать, а может не кастовать - если не стал кастовать эту абилу в первый раз, то и всю игру - т. е. весь конкретный запуск конкретно этой карты - уже не станет, но добавлением абилы заранее нейтральному зданию, т. е. прелоадом, лечится надёжно).
ответ
атачим равкод способности к юниту
способов атача дофига
подробнее в гугле

23

» WarCraft 3 / По поводу импорта текстур.

Похожие вопросы:

ответ
~8gabriel8:
Идея!
В модели один слой, а можно выделить ветви и на новый слой их, а там уже можешь делать смещение без коверкания наложения текстуры.
Что-то с моделью этой, не получается провернуть указанную операцию, постоянно вылетает ошибка.

23

» WarCraft 3 / Перенос героя

Похожие вопросы:

ответ
Maxsavin, я каждой карте из кампаний даю свой кэш, чтобы не перепуталось ничего.
Не знаю, что получилось бы, сделай я один кэш-файл на всю кампу и грузи карты потом не по порядку. Проверять не буду.
Кампания - это пак карт.
ответ
Кампании близов открываем и зырим, мне кажется или на каждой странице с вопросами есть такой вопрос?
ответ
Карты в студию.
ответ
~8gabriel8:
Horfey, во-первых, как верно предположил biridius, проблема в несовпадении равкодов. Чтобы увидеть равкоды в Редакторе объектов, нужно нажать Ctrl+D. Равкоды нестандартных данных обычно представляют букву и три цифры в самом начале названия объекта. Чтобы обойти проблему с ними, нужно либо создавать объекты в Редакторе кампаний, что на вкладке Нестандартные данные, либо редактировать стандартных юнитов.
Во-вторых, в кэше сохраняется много лишнего, а потом ещё неправильно загружается. Например, сохраняется smarts2, а загружается smarts. Как предполагаю, сохранение атрибутов героя необходимо при наличии в главе книг силы/ловкости/интеллекта, но в главе их нет, то есть и сохранять их не требуется, так как атрибуты примут свои значения в соответствии с опытом героя. По-хорошему, должно было быть так:
  • Крестьянин берёт лук или молот и становится бойцом, которому назначается переменная Daran;
  • Боец уничтожает тёмную башню и сохраняется в кэш, как Daran в категории Hero;
  • На следующей карте из кэша восстанавливается Daran из Hero, которому присваивается переменная Daran. Этот герой будет иметь опыт, способности и предметы из предыдущей главы, если они будут иметь правильные равкоды и там, и там.
В-третьих, чтобы игрок мог читать субтитры, если они у него в настройках отключены, есть действие Спецэффекты - Subtitle Display Override.
P. S. Сначала думал просто копировать из редактора объектов одной карты героев с их равкодами в другую, но их равкоды были заняты, потому копируемым юнитам назначался другой равкод. В таком случае мне бы потребовалось менять на карте персонажей на таких же, но с иным равкодом, а это потребовало бы досконального изучения триггеров ради корректной их работы, чего делать как-то не особо охота.
ответ
Варианты есть, но это будет сложновато. Стандартный gamecache не сохраняется на диск игрока в мультиплеере, тут нужны системы вроде datamanager, а так же почитать статьи про GetLocalPlayer() и о синхронизации данных:
GetLocalPlayer
Синхронизация
Еще вопросы?

23

» Администрация XGM / Ресурс

Похожие вопросы:

ответ
Если при поиске ресурсов к адресной строке добавить
?sortfield=datelineasc
то порядок показа по дате будет "от старых к новым"
остальные фильтры пока недоступны
Пример: xgm.guru/p/wc3/resources?sortfield=datelineasc
ответ
Привет. Воспользуйся функцией "Написать менеджеру" или кнопку [!] или обратись напрямую к любому админу или менеджеру и перечисли что хочешь удалить.
Если необходимо удалить проект - обращайся напрямую к админу. Менеджеры не могут удалять проекты которые уже прошли публикацию. Если необходимо удалить ресурс - достаточно обратиться к менеджеру.
А если аккаунт - к Богу
Пункты выдал ошибочно. Вскоре они будут сняты.
ответ
Да, создаёшь проект, а внутри него создаёшь уже ресурсы.
ответ
Исправлено
ответ
Проект проходит стадию проверки

23

» WarCraft 3 / Не работает триггер.

Похожие вопросы:

ответ
Steal nerves:
  1. посмотри в РО у абилок прописаны приказы
  2. попробуй выводить на экран (см. внизу ссылку). Тыкни этой абилкой на юнита и проверь
  3. поищи в текстовике cj_order.j (находится в архиве игры). Кстати можно этот текстовик на сайте найти, Скорп 1000 выставлял
  4. поищи на сайте, такой вопрос был. Кому-то я на такой вопрос отвечал
ратуша самой себе может продавать? попробуй настроить способность, и потыкает на себя пусть. Мб нельзя
ответ
Ради прикола поставь ожидание. Wait на 2 сек. Должно сработать.
ответ
ScopteRectuS, Я решил проблему там баг, если указать регион как точку назначения портала, то с ним триггеры перестают работать. Я просто указал другой регион.
biridius, Ну это альфа версия, за 5 мин сделал, знаю об утечках.
ответ
Ты в условиях установил каждое здание в итоге выходит так что чтобы тригер сработал нужно завершить улучшение во всех этих зданиях сделай для каждого по отдельности либо через если/тогда/иначе.
ответ
А группы в массиве CreepsGroup созданы? Нужно либо создавать группы при инициализации, проходясь циклом по массиву, либо в константах указать "размер" массива, и тогда они будут сами созданы. То есть нужно 12 групп -- ставишь размер 12, группы будут созданы в ячейках с 0 по 11.

23

» WarCraft 3 / Правка урона

Похожие вопросы:

ответ
8gabriel8
я переписал всё на jass - вроде работает как надо
MUI как побочный эффект от хештаблицы и таймера
проверь как работает, а то я сутками не спал
Я там если что поменял Set Life на UnitDamageTarget, чтобы золото капало с убитых гноллов
И если нужно будет поменять способность на другую - то просто в константе passiveAbility поменять равкод
и ещё я там расставил комментарии где можно редактировать волны

23

» WarCraft 3 / AdicHelper?

Похожие вопросы:

ответ
Поставил расстояние 256 там, где вычисляются полярные координаты - всё заработало. То есть слишком маленькие значения нельзя, как 64, всё ясно. Тема закрыта.
ответ
Вот как должен выглядеть полностью правильный триггер без утечек, единственная утечка создастся только при первом использовании, это я так понял переменная группы, ее обнулять нельзя, иначе скил будет работать только раз.
ответ
~8gabriel8:
PhysCraft, он уже пробовал этот метод. Не подошёл из-за белых портретов.
Steal nerves, извини, обманул тебя. Чтобы сделать вынесение в отдельную поверхность, надо сначала удвоить вершины. Но только почему-то нормально не работает, часть вершин не удваивается.
Сейчас посмотрю, как с анимацией текстур работал.
А ведь ты не сделал копию анимаций, просто продублировал имеющиеся, дав им название с тэгом. Это не даст желаемого.

Извини, но пока путного не получается. Может быть опосля придёт умная мысля.
По идее всё равно надо делать реальную копию анимационного ряда, а не просто дать новое название тем же кадрам. Может быть ты в процессе копирования кадров согласишься, что легче создать кучу крестьянок с новыми моделями в РО и триггерно их заменять, чем одну почти такую же тяжёлую за счёт анимаций модель с тэгами. При этом не факт, что у неё с портретом будет порядок.
ответ
Личный опыт:
  1. Заходить в карту чтобы скоротать время, пока друзья ещё не пришли/ ещё играют (в ту катку, с которой ты вылетел/крашнулся)
  1. Цель от данной игры:
(большинство рпг)
*1) Попытаться выбить что-то, что падает с одноразового босса, и свалить на рмк
*2) Помочь другу попытаться выбить что-то, что падает с в пункте 1
(большинство других карт)//(Те же тролли и эльфы)
[Больше психология и нежелание играть в неравных условиях]
*1) Этот эльф абузит что-либо!
*2) Эти эльфы собрались в войсе и абузят одну стенку на четверых! Делал так вчера :D
*3) Этот тролль играет с мх и всегда сразу находит любого эльфа на большой карте!
  1. Попытка поиграть во что-то, оборачивается чем-то плохим:
*1) Выбивается инэт/свет/ потолок падает на игрока
*2) Вырубается что-то из оборудования, в следствии чего пк зависает/уходит в ребут
*3) Крашит/Десинкает из вара
*4) Винда что-то непонятное выводит (Та же нехватка озу/бэды на харде)
  1. Определённый сегмент игроков, зовущийся троллями которые что и делают что по кд оскорбляют других, и подпалив игроков просто ливают.
  1. Отдельно насчёт игроков: цифры = пункты выше из шапки
Пункты 1, 2, 5, 6, 7, 8, 9, 10, 12 относятся больше к тому, что игроки с "ини" показывают друг другу зубы и соблюдают этот стиль общения на протяжении всей катки
Пункты 8,12 относятся к тем, с чем можно смириться и продолжить играть в мапу
Пункт 6 - для "Соло" карт, которые просто нельзя пройти в одного, не имея друзей ,что мной расценивается как просто потеря времени
Идеальной карты нет и небудет - вы не сможете совместить абсолютно все жанры, которые нравятся комьюнити - Одновременно ТД и РПГ я ещё не видел, не зря это разные жанры.
Если она и будет, то все наткнутся на лимит в 12 слотов, с которых гарена наврядли когда выйдет.

23

» WarCraft 3 / Хеш-таблица и юнит

Похожие вопросы:

ответ
событие - юнит получает урон
условие - юнит получивший урон имеет баф (баф стрелы)
Pippetz, лучше не яд а ледяные стрелы
ответ
Нашёл систему, где звук передаётся в таймер, который истекает через 0 секунд. В результате один и тот же звук может проигрываться несколько раз без всяких проблем. В инетике пишут мол это такой баг движка.
ответ
zlowar:
То есть дебаф должен всегда обновляться.)
Зачем ты делаешь триггерный дебафф? В дефолте так устроено, что дебафф заменяется, так вешай же дефолтно
ответ
вариант №1 - не нулить переменные, оставляя утечки номеров хендлов. это безопасно, да, если знаешь, что делаешь.
№2 - ловить UNIT_DEATH и чистить за ним
ответ
orc01, есть событие EventUnitsInRange, делаешь триггер, а при постройки башни добавляешь в него это событие для каждой башни, в условиях проверяешь что тот кто подошел нужного тебе типа юнит, ну действия думаю проблем не вызовут...

23

» WarCraft 3 / Конвертация в строку

Похожие вопросы:

ответ
1)Нужно ли при создании на джассе в конце обнулять/удалять что-то как при создании на ГУИ типо set u = null и т.д.?
Да нужно, но далеко не все. Чекни статьи, там про это расписано подробно.
2)Как видно на скрине юниту даются способности на 10 сек, можно ли в одной строчке это как то написать, а не писать каждый скилл в новой строке? Попытался сделать через , выдало ошибку.
Нет, только по одному. И TriggerSleepAction я бы использовать не стал, вместо них я бы заюзал таймеры.
3)Слышал про при конвертации в текст остаются пару лишних строк в триггере, абсолютно ненужные я удалил(Которые были при создании на ГУИ, скрин 2), нужно ли еще что-то удалять?
Не совсем понял вопрос, уточни о чем ты?
ответ
S2I принимает строку в качестве параметра и никак её не изменяет
с чего вдруг он должен создавать новые строки?
I2S создаёт временную строку
если в таблице есть строка равная временной по хэшу то он возвращает строку из таблицы
если в таблице строки нету то он добавляет нашу временную строку в таблицу
т.е. обычный алгоритм хэширования
ответ
Потому что у триггеров нет имен.
Создаем массив строк name_array;
Создаем массив триггеров trigger_array;
Создаем инт name_array_index;
Создаем функцию
register_trigger(Trigger trigger, string name) {
    name_array[name_array_index] = name;
    trigger_array[name_array_index] = trigger;
    name_array_index = name_array_index + 1;
}
Создаем функцию
name_to_trigger(string name) {
    for (integer index = 0; index < name_array_index; index++) {
        if name_array[index] == name {
            return trigger_array[index];
        }
    }
}
Затем регистрируем все триггеры через register_trigger.
А после этого думаем, реально ли у нас столько абилок, что простая последовательность if name == "my_ability" then RunTrigger(my_ability) хуже этого решения

23

» WarCraft 3 / Спелла нет

Похожие вопросы:

ответ
А касательно остальной части, если UnitUserData нигде не используется, создаешь массив юнитов и отрядов. Массив юнитов забиваешь своими капитанами. В UnitUserData капитана пихаешь его порядковый номер в массиве. Создаешь группу юнитов для этого капитана.
  1. Добавление через каст способности.
Я бы делал через 2 разные абилки с одной и той же позицией в интерфейсе. Пока нужный тебе юнит не является частью отряда - у него таргетная абилка при касте которой на капитана он добавляется в группу соответствующего капитана и получает 2ю абилку взамен первой.
Касательно выделения этих пехотинцев - можно намутить что-то с передачей контроля или создать триггер, который будет снимать выделение с юнитов у которых есть 2я абилка. Если ты хочешь чтобы по одиночке можно было выделять пехотинцев - можешь создать переменную для каждого игрока с капитанами, куда будет просто записываться последний выбранный юнит. При снятии выделения - проверять не выбран ли этот же юнит, в случае чего не снимать выделение. Правда не уверен будет ли корректно работать :> В крайнем случае - будет работать в три клика вместо двух. Если я не ошибаюсь.
Касательно поведения этих пехотинцев - что-то реально стоящее сделать сложно. Возможно, но мне не с руки все расписывать :> Простейший вариант - приказывать пехотинцам после добавления в группу следовать за капитаном.
  1. Добавление через атаку капитана
Триггер, проверяющий что капитан получил урон или атакован, как угодно. Далее любым способом проверяешь есть ли в группе этого капитана юниты. Если нет - выбираешь всех пехотинцев N радиусе, добавляешь в отряд, заменяешь абилку/либо просто приказываешь кастануть в капитана первую абилку.
ответ
Разобрался сам.
ответ
native UnitHasItem takes unit whichUnit, item whichItem returns boolean
function UnitHasItemOfTypeBJ takes unit whichUnit, integer itemId returns boolean
    return GetInventoryIndexOfItemTypeBJ(whichUnit, itemId) > 0
endfunction

// Данная функция утечна, так как indexItem не обнуляется
function GetInventoryIndexOfItemTypeBJ takes unit whichUnit, integer itemId returns integer
    local integer index
    local item    indexItem

    set index = 0
    loop
        set indexItem = UnitItemInSlot(whichUnit, index)
        if (indexItem != null) and (GetItemTypeId(indexItem) == itemId) then
            return index + 1
        endif

        set index = index + 1
        exitwhen index >= bj_MAX_INVENTORY
    endloop
    return 0
endfunction
function UnitHasItemOfType takes unit whichUnit, integer itemId returns boolean
    local integer index = 0
    loop
        if GetItemTypeId(UnitItemInSlot(whichUnit, index)) == itemId then
            return true
        endif
        set index = index + 1
        exitwhen index == bj_MAX_INVENTORY
    endloop
    return false
endfunction

// Можно ещё так написать
function UnitHasItemOfType takes unit whichUnit, integer itemId returns boolean
    local integer index = 0
    loop
        exitwhen GetItemTypeId(UnitItemInSlot(whichUnit, index)) == itemId
        set index = index + 1
        exitwhen index == bj_MAX_INVENTORY
    endloop
    return index < bj_MAX_INVENTORY
endfunction
ответ
Разобрался, может кому-то пригодится

23

» WarCraft 3 / Проблемы с триггером в карте(1.26)

Похожие вопросы:

ответ
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
ответ
~8gabriel8:
Просто предметы перестают быть триггерно скрытыми после загрузки сохранения. Надо делать либо по твоему варианту, то есть создавать предмет, либо по варианту ssbbssc, то есть куда-то переносить предметы при инициализации карты, а в нужный момент возвращать на старые позиции.
Ещё при загрузке слетает цвет воды и освещение, если они нестандартные. Нужно задавать их в триггере с событием Игра загружена.
Если цвет воде можно задать в GUI, то для освещения потребуется Custom Script. Вот тут мне помогли нестандартное освещение опять задать:
Ещё сложность в дополнительных кампаниях сбрасывается после каждой главы, но вроде бы ты не пользуешься уровнями сложности.
Сбрасывается, когда нажимаешь Продолжить, а если выходишь на экран кампании с кнопками глав, то всё нормально.
По идее с событием Игра загружена можно и с предметами аналогично поступать, скрывая их, если они ещё не активированы. Но потребуется вводить ещё переменные, которые будут указывать видимость или невидимость у предмета.

23

» WarCraft 3 / Процентный хил

Похожие вопросы:

ответ
Если не ошибаюсь надо текущее здоровье + текущее здоровье*0.10. Тогда будет прибавка в 10%.

23

» WarCraft 3 / Хеш-таблица

Похожие вопросы:

ответ
~16GB:
вот спелл пак там реализация спелов гуи хэш
ответ
vexorian optimiser
ответ
Steal nerves:
В хеш-таблице изначально возвращает null (это если ничего не записано). Помню делал похожую систему только с итемами, при проверке через Load... проверял не пуста ли ячейка (!=null). По какой-то причине, уже не помню, не всегда так работает, неизвестно от чего система не работает, щас лень браться и искать ошибку.
В вашем понимании null на jass:
 null = Нет боевая единица.
Ответ: чтобы записать null, ничего не надо записывать. Чтобы записать ноль у целого (0) или вещественного (0.00) числа, тоже ничего не надо перезаписывать. Если ничего не записано, вернет null или ноль. Пользуемся дебагами и проверяем.
Еще не попутал ли ты ключи местами? Там на гуи 1, 2 на jass перевернуть надо типа 2, 1. Смотрим
смотрим
есть BJ тоже гуи-команды. конвентируем в код и видим есть SaveUnitHandleBJ и SaveUnitHandle. Нужно представить ключи в таком порядке в каком изложены в нативке SaveUnitHandle а не в SaveUnitHandleBJ (ибо потом вас гуи путает):
parentKey - родительский ключ
childKey - младший ключ
представить хэш-таблицу можно как таблицу Excel, parentKey как строку, а childKey как столбик. И по этим вы находите ячейку. Еще в плюсе хэндлы юзать, по хэндлам будете строки находить. Стираете инфу тоже по хэндлу, по родительскому ключу. А если нужно стереть строку используйте FlushChildHashtable
function SaveUnitHandleBJ takes unit whichUnit, integer key, integer missionKey, hashtable table returns boolean
    return SaveUnitHandle(table, missionKey, key, whichUnit)
endfunction

native SaveUnitHandle takes hashtable table, integer parentKey, integer childKey, unit whichUnit returns boolean
проверка
native HaveSavedHandle takes hashtable table, integer parentKey, integer childKey returns boolean
удаление
native RemoveSavedHandle takes hashtable table, integer parentKey, integer childKey returns nothing
и правильно иницировал хэш-таблицу?
ответ
Скачаю чистый варкрафт 1.26 попробую.
Рекомендую эти торренты.
Русская версия.
Английская версия.

23

» WarCraft 3 / Баг с триггерами зависает wc3 и ломается поведение юнитов

Похожие вопросы:

ответ
Не юзайте стандартные лупы А и Б.
Никогда.
ответ
~8gabriel8:
Если ставить задержку, не багается:
ответ
~8gabriel8:
Просто предметы перестают быть триггерно скрытыми после загрузки сохранения. Надо делать либо по твоему варианту, то есть создавать предмет, либо по варианту ssbbssc, то есть куда-то переносить предметы при инициализации карты, а в нужный момент возвращать на старые позиции.
Ещё при загрузке слетает цвет воды и освещение, если они нестандартные. Нужно задавать их в триггере с событием Игра загружена.
Если цвет воде можно задать в GUI, то для освещения потребуется Custom Script. Вот тут мне помогли нестандартное освещение опять задать:
Ещё сложность в дополнительных кампаниях сбрасывается после каждой главы, но вроде бы ты не пользуешься уровнями сложности.
Сбрасывается, когда нажимаешь Продолжить, а если выходишь на экран кампании с кнопками глав, то всё нормально.
По идее с событием Игра загружена можно и с предметами аналогично поступать, скрывая их, если они ещё не активированы. Но потребуется вводить ещё переменные, которые будут указывать видимость или невидимость у предмета.
ответ
богопротивные 0,-11 нужно менять на православные buttonpos=-2147483648,-2147483648

23

» WarCraft 3 / Баг в карте юниты перестали ходить

Похожие вопросы:

ответ
Лучший ответ: Потому что так задумал автор карты
ответ
Свойства карты - Параметры - Нестандартное звуковое окружение. Там посмотри.
ответ
Таких багов много, почему то оптимизатор берет данные из слк таблиц игры на часть объектов, пробуй wc3ultimate opt, на хайве выложена... Мб кто уже и новый виджитайзер запилил.
ответ
~8gabriel8:
Убери такие пути и проверьте опять.
ответ
богопротивные 0,-11 нужно менять на православные buttonpos=-2147483648,-2147483648

23

» WarCraft 3 / Проблема с выбором цели в триггерах

Похожие вопросы:

ответ
Не юзай TriggerSleepAction и будет тебе счастье. Особенно когда юзаешь глобальные переменные, вполне вероятно, что конфликт
ответ
Резюмируя:
  • стремиться создавать объекты не на карте, а в триггерах, сохраняя ссылки на нужные из них;
  • там, где в гуи открываются окна со списком из РО, использовать джасс и вводить равкод, а там, где список расставленных на карте юнитов, использовать переменные;
  • в РО с полями, где указаны объекты, работать через Shift+Enter и вводить равкод, чтобы не открывать список.
*Равкод в РО можно посмотреть, нажав Ctrl+D

23

» WarCraft 3 / Тим колор

Похожие вопросы:

ответ
В общем покопался,
Цвета находятся в \ReplaceableTextures\TeamColor\
Внутри 16 текстур TeamColorXX.blp (где ХХ от 00 до 15) которые имеют свои цвета. (размер 8х8)
Внутри карты их заменить нельзя (приоритет на чтении из war3.mpq)
Так же там есть героическое свечение, находится в \ReplaceableTextures\TeamGlow\
Очень жаль что нельзя сменить цвет средствами карты. Это бы открыло большие возможности. (например сделать 15 разных покрасок одной и той же модели)
ответ
советую переименовать модель\заребутить комп
текстуры стандартные юзал, я так понимаю
ответ
NekoriDes:
niBeHb, скинь карту, расскажи что делал. Без какой-то инфы едва ли тебе возьмут и ответят. Только догадки.
Уже помощь не требуется, я просто удалил всех юнитов и расставил их заново, всё прошло само собой.
ответ
На саму декорацию вряд ли, но можно взять просто постройку и дать пассивку москитов

23

» WarCraft 3 / Как изменить применение способности.

Похожие вопросы:

ответ
Сделать свою способность на основе Канала, настроить применение на точку. При событии каста создавать юнитов в точке каста. Все необходимое есть в статьях ( тут и тут).

23

» WarCraft 3 / Восстановление здоровья

Похожие вопросы:

ответ
Aloc исключает юнита из целей любой стандартной ауры
ответ
Эм есть и другая аура лечение для союзников без заклинание. Это "Дух целитель" рав-код Aoar
ответ
Steal nerves, Я сделал с детектором бафа обычного лечение, здоровье восстанавливаю триггерно, забил на ауру.
ответ
все вокруг него автоматически поджигались.
Сделай спел на основе канала, при применении создаёшь руну с дождём и даёшь герою, ИЛИ создаёшь даммика и приказываешь ему кастовать дождь, но с руной всё же лучше.
ответ
дать способность с отрицательной регенерацией.

23

» WarCraft 3 / Пересадка отдельных анимации

Похожие вопросы:

ответ
Есть древний AnimTransfer, но он работает только на моделях с идентичным скелетом. Скачать можно там.

23

» WarCraft 3 / Способность с процентом здоровья

Похожие вопросы:

ответ
Эм есть и другая аура лечение для союзников без заклинание. Это "Дух целитель" рав-код Aoar
ответ
Реализовал через второй вариант:
Дальше пришла в голову другая идея. Думаю, можно сделать с помощью ремонта зданий Альянса: на месте смерти героя создаётся здание с моделью креста со здоровьем 1/100 ед., а союзные герои ремонтируя крест будут повышать её здоровье, получается некая иллюзия прогресс бара. И если спрятать способность ремонта с помощью функции HideAbilityButton( ) из мемхака, то будет ли она срабатывать при нажатии на ПКМ? Также, как отловить момент полного ремонта здания? С помощью таймера проверять процент здоровья каждые доли секунды?
раскрыть
scope HeroRevive initializer Initialization


    struct herorevive
        private                    unit           dyingUnit
        private                    unit           reincarnate
        private                    real           life

        private                    thistype       prev
        private                    thistype       next

        public   static  constant  trigger        trig    =  CreateTrigger( )
        public   static  constant  timer          period  =  CreateTimer( )


        private static method iterate takes nothing returns nothing
            local  thistype  this  =  thistype( 0 ).next

            loop
                exitwhen ( this == 0 )

                if ( GetWidgetLife( this.reincarnate ) > this.life ) then
                    set  this.life  =  GetWidgetLife( this.reincarnate )

                elseif ( GetWidgetLife( this.reincarnate ) >= GetUnitState( this.reincarnate, UNIT_STATE_MAX_LIFE ) ) then
                    call ReviveHero( this.dyingUnit, GetUnitX( this.dyingUnit ), GetUnitY( this.dyingUnit ), true )
                    call RemoveUnit( this.reincarnate )

                    set  this.reincarnate  =  null
                    set  this.life         =  0.0

                    set  this.prev.next    =  this.next
                    set  this.next.prev    =  this.prev

                    if ( thistype( 0 ).next == 0 ) then
                        call PauseTimer( thistype.period )
                    endif

                    call thistype.deallocate( this )

                elseif ( GetWidgetLife( this.reincarnate ) <= this.life ) then
                    set  this.life  =  1.0
                    call SetWidgetLife( this.reincarnate, this.life )
                endif

                set this = this.next

            endloop
        endmethod


        public static method actions takes nothing returns nothing
            local  thistype  this  =  thistype.allocate( )

            set  this.next         =  0
            set  this.prev         =  thistype( 0 ).prev
            set  this.next.prev    =  this
            set  this.prev.next    =  this

            set  this.dyingUnit    =  GetDyingUnit( )
            set  this.reincarnate  =  CreateUnit( GetOwningPlayer( this.dyingUnit ), 'h003', GetUnitX( this.dyingUnit ), GetUnitY( this.dyingUnit ), 0.0 )
            set  this.life         =  1.0

            call SetUnitPathing( this.reincarnate, false )
            call SetWidgetLife( this.reincarnate, this.life )

            if ( this.prev == 0 ) then
                call TimerStart( thistype.period, 0.10, true, function thistype.iterate )
            endif
        endmethod


        public static constant method conditions takes nothing returns boolean
            return IsUnitType( GetDyingUnit( ), UNIT_TYPE_HERO )
        endmethod


    endstruct


    public function Initialization takes nothing returns nothing
        call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 1 ), EVENT_PLAYER_UNIT_DEATH, null )
        call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 2 ), EVENT_PLAYER_UNIT_DEATH, null )
        call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 3 ), EVENT_PLAYER_UNIT_DEATH, null )
        call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 4 ), EVENT_PLAYER_UNIT_DEATH, null )

        call TriggerAddCondition( herorevive.trig, Condition( function herorevive.conditions ) )
        call TriggerAddAction( herorevive.trig, function herorevive.actions )
    endfunction


endscope
Вот только если спрятать кнопку через HideAbilityButton( ), то способность ремонта зданий исчезает и не работает через ПКМ.